#!/usr/bin/env python3
"""
数据库初始化脚本
"""

import sys
import os

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from sqlalchemy import text
from app.database import engine, Base, SessionLocal
from app.models import User, Balance, BalanceTransaction, Monitor, ProductNotification, Notification
from app.models.balance import TransactionType
from app.config import settings


def create_database():
    """创建数据库（如果不存在）"""
    try:
        # 数据库已经存在，直接跳过创建步骤
        print(f"ℹ️ 使用现有数据库 '{settings.DB_NAME}' 在 {settings.DB_HOST}")
        return True

    except Exception as e:
        print(f"❌ 连接数据库失败: {e}")
        return False


def create_tables():
    """创建所有数据表"""
    try:
        # 创建所有表
        Base.metadata.create_all(bind=engine)
        print("✅ 数据表创建成功")
        
        # 打印创建的表
        print("\n📋 已创建的数据表:")
        for table_name in Base.metadata.tables.keys():
            print(f"  - {table_name}")
            
    except Exception as e:
        print(f"❌ 创建数据表失败: {e}")
        return False
    
    return True


def create_test_data():
    """创建测试数据"""
    db = SessionLocal()
    try:
        # 检查是否已有数据
        if db.query(User).first():
            print("ℹ️ 数据库中已有数据，跳过测试数据创建")
            return True
        
        print("🔄 创建测试数据...")
        
        # 创建测试用户
        from app.utils.security import get_password_hash
        
        test_user = User(
            email="test@example.com",
            hashed_password=get_password_hash("password123"),
            nickname="测试用户",
            is_verified=True,
            is_active=True
        )
        db.add(test_user)
        db.flush()  # 获取用户ID
        
        # 创建用户余额
        user_balance = Balance(
            user_id=test_user.id,
            amount=5.00,  # 给测试用户5点余额
            total_recharged=5.00
        )
        db.add(user_balance)
        
        # 创建注册奖励交易记录
        bonus_transaction = BalanceTransaction.create_register_bonus(
            user_id=test_user.id,
            amount=1.00
        )
        db.add(bonus_transaction)
        
        # 创建充值交易记录
        recharge_transaction = BalanceTransaction(
            user_id=test_user.id,
            transaction_type=TransactionType.RECHARGE,
            amount=4.00,
            balance_before=1.00,
            balance_after=5.00,
            description="测试充值",
            payment_method="test"
        )
        db.add(recharge_transaction)
        
        # 创建测试监控任务
        test_monitor = Monitor.create_keyword_monitor(
            user_id=test_user.id,
            keyword="煤炉",
            name="测试监控 - 煤炉"
        )
        db.add(test_monitor)
        
        db.commit()
        print("✅ 测试数据创建成功")
        print(f"  - 测试用户: {test_user.email}")
        print(f"  - 用户余额: {user_balance.amount} 点")
        print(f"  - 监控任务: {test_monitor.name}")
        
    except Exception as e:
        db.rollback()
        print(f"❌ 创建测试数据失败: {e}")
        return False
    finally:
        db.close()
    
    return True


def main():
    """主函数"""
    print("🚀 开始初始化数据库...")
    print(f"📍 数据库URL: {settings.DATABASE_URL}")
    
    # 1. 创建数据库
    if not create_database():
        return
    
    # 2. 创建数据表
    if not create_tables():
        return
    
    # 3. 创建测试数据
    if not create_test_data():
        return
    
    print("\n🎉 数据库初始化完成！")
    print("\n📖 使用说明:")
    print("  - 测试用户邮箱: test@example.com")
    print("  - 测试用户密码: password123")
    print("  - 可以使用此账号登录系统进行测试")


if __name__ == "__main__":
    main()
